unit uCompareDataThread;

interface

uses
  System.Classes, System.SysUtils, Vcl.ComCtrls, Vcl.StdCtrls, Data.DB,
  uBaseCompThread;

type
  TCompareData = class(TBaseCompThread)
  private
    FirstDate: TDateTime;
    SecondDate: TDateTime;
    idPredpr: Int64;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean; idPredpr: int64;
                       FirstDate, SecondDate: TDateTime; ProgressBar: TProgressBar;
                       StatusBar: TStatusBar; PageControl: TPageControl;
                       LoadExcelFileBtn, UpdateBtn: TButton); overload;
  end;

var
  CompareData: TCompareData;

implementation

uses uCompDM;

{ TCompareData }

constructor TCompareData.Create(CreateSuspended: Boolean; idPredpr: int64;
                                FirstDate, SecondDate: TDateTime;
                                ProgressBar: TProgressBar; StatusBar: TStatusBar;
                                PageControl: TPageControl; LoadExcelFileBtn,
                                UpdateBtn: TButton);
begin
  inherited Create(CreateSuspended, ProgressBar, StatusBar, PageControl,
                   LoadExcelFileBtn, UpdateBtn);

  Self.idPredpr := idPredpr;
  Self.FirstDate := FirstDate;
  Self.SecondDate := SecondDate;
end;

procedure TCompareData.Execute;
var item: string;
begin
  with CompDM do
  try
    Synchronize(CompareMemTableEh.DisableControls);
    CompareMemTableEh.Active := False;

    Synchronize(SelectSvodDuples.DisableControls);

    Self.Enabled := False;
    Synchronize(ChangeControlAvailability);

    Self.StatusText := 'Получение информации из временной таблицы...';
    Synchronize(SetStatusBarText);

    CrSvodInv.ExecSQL;
    CrSvodDuples.ExecSQL;
    CrSprProv.ExecSQL;

    Self.PBStyle := pbstMarquee;
    Synchronize(SetProgressBarStyle);

    // Цикл по филиалам
    for item in ObjectsDict.Keys do
    try
      ConnectToObject(ObjectsDict.Items[item]);

      CrInvProv.ExecSQL;

      with InsInvProvData do
      begin
        Parameters.ParamByName('FirstDate').Value := DateToStr(Self.FirstDate);
        Parameters.ParamByName('SecondDate').Value := DateToStr(Self.SecondDate);

        if Self.idPredpr>0 then
          SQL[SQL.Count-2] := 'WHERE ISNULL(ISNULL(spr.globalcode, inv.globalcode),'+
                              QuotedStr('')+')='+QuotedStr(IntToStr(Self.idPredpr))
        else
          SQL[SQL.Count-2] := '-- Условие для предприятия';

        ExecSQL;
      end;

      with SelectSprProvObj do
      begin
        Close;
        Parameters.ParamByName('FirstDate').Value := DateToStr(Self.FirstDate);
        Parameters.ParamByName('SecondDate').Value := DateToStr(Self.SecondDate);

        if Self.idPredpr>0 then
          SQL[SQL.Count-1] := 'AND ISNULL(pred.globalcode, '+QuotedStr('')+')='+
                              QuotedStr(IntToStr(Self.idPredpr))
        else
          SQL[SQL.Count-1] := '-- Условие для предприятия';

        Open;
      end;

      Self.StatusText := 'Обновление таблицы проводок - '+item;
      Synchronize(SetStatusBarText);

      // Заполнение временной таблицы с проводоками
      if not SelectSprProvObj.IsEmpty then
      begin
        SelectSprProvObj.First;

        while not SelectSprProvObj.Eof do
        begin
          InsertSprProv(SelectSprProvObjNumBuhSpr.AsString,
                        SelectSprProvObjNumDoc.AsString,
                        SelectSprProvObjnumDocPart.AsString,
                        SelectSprProvObjNSF.AsString,
                        SelectSprProvObjDataDoc.AsDateTime,
                        SelectSprProvObjSumm.AsCurrency,
                        SelectSprProvObjglobalcode.AsVariant,
                        SelectSprProvObjdopUNN.AsInteger);

          SelectSprProvObj.Next;
        end;
      end;


      Self.StatusText := 'Обновление таблицы дубликатов - '+item;
      Synchronize(SetStatusBarText);

      SelectDuplicateProv.Close;
      SelectDuplicateProv.Open;

      // Заполнение временной таблицы с дубликатами проводок
      if not SelectDuplicateProv.IsEmpty then
      begin
        SelectDuplicateProv.First;

        while not SelectDuplicateProv.Eof do
        begin
          InsertSvodDuples(SelectDuplicateProvNumBuhSpr.AsString,
                           SelectDuplicateProvdocNumber.AsString,
                           SelectDuplicateProvnumBuhinv.AsString,
                           SelectDuplicateProvfullName.AsString,
                           SelectDuplicateProvnamePredpr.AsString,
                           SelectDuplicateProvdocDate.AsDateTime,
                           SelectDuplicateProvsprSum.AsCurrency,
                           SelectDuplicateProvtotalVat.AsCurrency,
                           SelectDuplicateProvdopUNN.AsInteger);

          SelectDuplicateProv.Next;
        end;
      end;

      Self.StatusText := 'Обновление таблицы результатов - '+item;
      Synchronize(SetStatusBarText);

      SelectInvProvData.Close;
      SelectInvProvData.Open;

      // Заполнение временной таблицы с результатами выборки
      if not SelectInvProvData.IsEmpty then
      begin
        SelectInvProvData.First;

        while not SelectInvProvData.Eof do
        begin
          InsertSvodInv(SelectInvProvDataglobalcode.AsVariant,
                        SelectInvProvDatafullName.AsVariant,
                        SelectInvProvDatadateTrans.AsVariant,
                        SelectInvProvDatainvStatus.AsVariant,
                        SelectInvProvDatasprSum.AsVariant,
                        SelectInvProvDatatotalVat.AsVariant,
                        SelectInvProvDatatotalCost.AsVariant,
                        SelectInvProvDatatotalCostVat.AsVariant,
                        SelectInvProvDataSvplace.AsVariant,
                        SelectInvProvDataNumBuhSpr.AsVariant,
                        SelectInvProvDataNumDocPart.AsVariant,
                        SelectInvProvDatadocNumber.AsString,
                        SelectInvProvDatadocDate.AsDateTime,
                        SelectInvProvDatadopUnn.AsInteger);

          SelectInvProvData.Next;
        end;
      end;
    except
      on econ: EConnectException do
      begin
        Self.ErrorMessage := 'Произошла ошибка при подключении к объекту '+item+
                             ' с текстом: '+econ.Message;
        Synchronize(ShowErrorDialog);
        Self.StatusText := 'Ошибка при подключении к объекту: '+item;
        Synchronize(SetStatusBarText);
        Exit;
      end;
      on e: Exception do
      begin
        Self.ErrorMessage := 'Объект: '+item+#13#10+e.Message;
        Synchronize(ShowErrorDialog);
        Self.StatusText := 'Ошибка при получении информации в объекте: '+item;
        Synchronize(SetStatusBarText);
        Exit;
      end;
    end;

    try
      Self.StatusText := 'Сравнение результатов с камеральным контролем...';
      Synchronize(SetStatusBarText);

      with SelectSvodInv do
      begin
        Close;
        Parameters.ParamByName('FirstDate').Value := DateToStr(Self.FirstDate);
        Parameters.ParamByName('SecondDate').Value := DateToStr(Self.SecondDate);

        if Self.idPredpr>0 then
          SQL[SQL.Count-2] := 'AND ISNULL(inv.idPredpr, exc.idPredpr)='+
                              QuotedStr(IntToStr(Self.idPredpr))
        else
          SQL[SQL.Count-2] := '-- Условие предприятия';

        Open;
      end;

      Self.StatusText := 'Формирование таблицы результатов...';
      Synchronize(SetStatusBarText);

      SelectSvodDuples.Close;
      SelectSvodDuples.Open;
      Synchronize(SelectSvodDuples.EnableControls);

      CompareMemTableEh.Active := True;
      CompareMemTableEh.First;
      Synchronize(CompareMemTableEh.EnableControls);

      ADOQuery1.Close;
      ADOQuery1.Open;

      Self.StatusText := 'Формирование завершено. Количество записей: '+
                         IntToStr(SelectSvodInv.RecordCount)+'.'+
                         'Количество дубликатов: '+
                         IntToStr(SelectSvodDuples.RecordCount)+'.';
      Synchronize(SetStatusBarText);
    except
      on e: Exception do
      begin
        Self.ErrorMessage := 'Ошибка отображения информации с тескстом: '+e.Message;
        Synchronize(ShowErrorDialog);
        Self.StatusText := 'Ошибка при отображении информации';
        Synchronize(SetStatusBarText);
      end;
    end;
  finally
    Self.Enabled := True;
    Synchronize(ChangeControlAvailability);

    Self.PBStyle := pbstNormal;
    Synchronize(SetProgressBarStyle);
  end;
end;

end.
